#! /bin/bash

## author: huanlf AT gmail.com li-jiahuan
## 这个脚本用为连接某一个无线网络

ESSID=xxxxxx        ## AP essid
PASSWD=yyyyy        ## ascii 密码
IP=192.168.1.2      ## 静态IP
GW=192.168.1.1      ## 网关
NS=202.96.134.133   ## 域名服务器

## 检查是否可以找到AP
check_ap()
{
    iwlist wlan0 scan | grep -q "ESSID:\"$ESSID\""
}

## 检查网关是否是通的
check_gw()
{
    ping -c2 -w2 "$GW" &> /dev/null
}

## 配置无线网口
config_wlan0()
{

    ## 重新加载intel的无线模块
    modprobe -r iwlagn
    modprobe iwlagn

    ## 激活网口
    ifconfig wlan0 up

    ## 配置网口
    iwconfig wlan0 essid "$ESSID" key "s:$PASSWD"
    #dhclient wlan0 ## shit, 100% on cpu by kernel thread [event]

    ## 配置网口的IP
    ifconfig wlan0 "$IP" up

    ## 配置域名服务器
    if ! grep -wq "^[[:blank:]]*nameserver" /etc/resolv.conf; then
	    echo "nameserver $NS" >> /etc/resolv.conf
    fi

    ## 配置默认网关
    if ! route -n | grep -q '^0'; then
        route add default gw "$GW"
    fi
}

## --------------------- main --------------------- ##
## 加载驱动模块， 以查找AP
modprobe iwlagn
ifconfig wlan0 up

## 循环检测AP和网关是否OK， 不OK则重新配置
while :; do

    ## 循环检测AP， 一直到成功
    if ! check_ap; then
	  sleep 5s
	  continue
    fi

    ## 循环检测网关，一直到配置好无线网口
    while :; do
    	if ! check_gw; then
    	    config_wlan0
	        sleep 2s
    	else
	        break
        fi
    done

    sleep 1m    ## check if we are online per 1m
done
